還是 OWASP TOP 10 中的影響力及破壞力最高的 Injection
包含 SQL Injection、Command Injection、DLL Injection、 …
Injection 的翻譯是插入,所以可以試想成夾帶一些髒髒的字元藏在正常的輸入中。
圖片來源
好像有奇怪的東西混進來了(?
以 SQL Injection 為例,由於程式中連接符號串聯 SQL 語句,語句未做參數化(Prepare Command),加上網站所提供的合法輸入介面,未檢核來源,使用者在輸入資料中夾帶一段 SQL 程式碼,送出時即執行 SQL 語句,執行傳入參數的指令,透過網站程式交予後端資料庫執行。
SELECT * FROM Account WHERE username='[帳號]' AND password='[密碼]';
SELECT * FROM Account WHERE username='[帳號]'OR'1'='1' AND password='[密碼]';
因為,OR '1'='1' 恆等式成立,故後續不用輸入密碼也能登入。
所以,這個弱點的根源在於程式的寫法以「連接字串」及「未過濾的內容」造成的弱點。
弱點其實很多,但新聞其實不會揭露是 SQL Injection 弱點。
日盛證券網站發現 SQL Injection 漏洞,數億資料外洩
弱點原因來自於攻擊者可以操縱最後執行的 SQL 語句,所以最佳的防治方法就是將SQL語句的"指令"與"資料"能夠互相隔離開來,注意一旦發現弱點,要一併修正所有 SQL 語句。
String username = request.getParameter("username");
String password = request.getParameter("password");
conn = new SqlConnection(_ConnectionString);
conn.Open();
SqlCommand query = new SqlCommand(
"SELECT * FROM Account WHERE username=@username
AND password=@password", conn);
query.Parameters.AddWithValue("@username", username.Text);
query.Parameters.AddWithValue("@password", password.Text);
SqlDataReader objReader = query.ExecuteReader();
白名單
最簡單的方式,就是限制輸入的內容
(1) 輸入來源的資料長度,由於指令通常都很長,所以限制適當的資料長度即可解決很多問題
(2) 輸入來源的資料內容,內容只能限制英文數字
但白名單寫法可能受限於部份功能,像說留言版、網誌…等等
資料過濾
不能真的解決這個弱點。
把已知的惡意指令及特殊字元替換掉或清掉,但系統相關指令即排除,但可能族繁不及備載 XDString replaceString=s1.replace(''','');
黑名單
不能真的解決這個弱點。列於黑名單中的指令就不執行,一樣族繁不及備載 XD
資料庫環境設定
' or '1'='1
And 1=1--
And 1=2--
';declare @a int;--
@@version>1
1/0
order by 100
' union select col1,col2,… from table--
;exec master..xp_cmdshell 'net user Hacker Hacker /add';--
;exec master..xp_cmdshell 'echo WEBSHELL > path/a.asp'--
;exec master..xp_regread 'HKEY_CURRENT_USER,Software\ORL\WinVNC3',Password;--
…